<?php

namespace Reusify\Helper;

class Date
{
    /**
     * 获取两个日期之间相差的天数
     *
     * @param string $date1 起始日期，如 '2025-09-05'
     * @param string $date2 结束日期，如 '2025-09-10'
     * @param bool $absolute 是否返回绝对值，默认 true
     * @return int 天数差
     * @throws \InvalidArgumentException 日期无效时抛出
     */
    public static function diffDays(string $date1, string $date2, bool $absolute = true): int
    {
        $d1 = strtotime($date1);
        $d2 = strtotime($date2);

        if ($d1 === false || $d2 === false) {
            throw new \InvalidArgumentException("无效的日期: $date1 或 $date2");
        }

        $diffSeconds = $d2 - $d1;
        $diffDays = (int)floor($diffSeconds / 86400); // 1天 = 86400秒

        return $absolute ? abs($diffDays) : $diffDays;
    }

    /**
     * 获取两个日期之间的日期列表
     *
     * @param string $startDate 开始日期，如 '2025-09-01'
     * @param string $endDate 结束日期，如 '2025-09-05'
     * @param string $format 日期格式，默认 'Y-m-d'
     * @return array 日期列表
     * @throws \InvalidArgumentException 日期无效或结束日期小于开始日期
     */
    public static function range(string $startDate, string $endDate, string $format = 'Y-m-d'): array
    {
        $start = strtotime($startDate);
        $end = strtotime($endDate);

        if ($start === false || $end === false) {
            throw new \InvalidArgumentException("无效的日期: $startDate 或 $endDate");
        }

        if ($end < $start) {
            throw new \InvalidArgumentException("结束日期不能小于开始日期");
        }

        $dates = [];
        for ($current = $start; $current <= $end; $current += 86400) { // 每次加 1 天（86400 秒）
            $dates[] = date($format, $current);
        }

        return $dates;
    }
}
